extends Node

const 初始数据:Dictionary={
	天赋刷新个数=18,
	可选天赋个数=4,
	最大可用属性点=20,
}

var CHR:int=0:						#颜值
	set(value):
		if value<0:
			value=0
		CHR=value	
		属性变化.emit()
							
var INT:int=0:						#智力
	set(value):
		if value<0:
			value=0
		INT=value
		属性变化.emit()
		
var STR:int=0:						#体质
	set(value):
		if value<0:
			value=0
		STR=value
		属性变化.emit()
		
var MNY:int=0:						#家境
	set(value):
		if value<0:
			value=0
		MNY=value
		属性变化.emit()
		
var SPR:int=0:						#快乐
	set(value):
		if value<0:
			value=0
		SPR=value
		属性变化.emit()
		
var LIF:int=0:						#生命
	set(value):
		if value<0:
			value=0
		LIF=value
		属性变化.emit()
		
var AGE:int=0:						#年龄
	set(value):
		if value<0:
			value=0
		AGE=value
		属性变化.emit()
		
var AGES:MyArray=MyArray.new():		#执行判断语句时,为兼容AGE?[]做的修改
	get():
		AGES.clear()
		AGES.append(AGE)
		return AGES
		
var EVT:MyArray=MyArray.new()		#事件
var TLT:MyArray=MyArray.new():		#天赋
	get():
		return 获取TLT()
		
var TMS:int=0						
var AEVT:MyArray=MyArray.new()

var 年度信息:String
var 天赋集:Array=[]
const 随机属性列表:Array=["CHR","INT","STR","MNY"]

const 属性字典:Dictionary={
	CHR="颜值",
	INT="智力",
	STR="体质",
	MNY="家境",
	SPR="快乐"
	}
var age_timer:Timer=Timer.new()
var 时间间隔:float=0.75
var 游戏进行中:bool=false

const 属性最大比例:float=0.5
var 天赋刷新个数:int=18
var 可选天赋个数:int=4
var 最大可用属性点:int=0:
	set(value):
		最大可用属性点=value
		可用属性点=最大可用属性点
		
var 可用属性点:int=0:
	set(value):
		if value<0:
			value=0
		可用属性点=value
		属性变化.emit()
	
signal 属性变化
signal 推送年度信息(信息)
signal 游戏结束
var 当前名人:名人数据类

func _ready():
	add_child(age_timer)
	age_timer.wait_time=时间间隔
	age_timer.timeout.connect(过一年)

func 执行语句(原始语句:String):
	var 语句=_语句预处理(原始语句)
	var ex=Expression.new()
	ex.parse(语句)
	return ex.execute([],self)
	
func _语句预处理(原始语句:String):
	var 语句:String=原始语句
	语句=语句.replace(" ","")
	语句=语句.replace("?",".contains")
	语句=语句.replace("!",".not_contains")
	语句=语句.replace("[","([")
	语句=语句.replace("]","])")
	语句=语句.replace("|"," or ")
	语句=语句.replace("&"," and ")
	语句=语句.replace("AGE","AGES")
	return 语句

func 属性生效(效果数据:Dictionary):
	var 属性改变信息:String
	for 属性 in 效果数据:
		if 属性=="RDM":
			改变随机属性(效果数据[属性])
			属性改变信息="所有属性"
			if 效果数据[属性]>=0:
				属性改变信息+="+"
			属性改变信息+=(str(效果数据[属性])+" ")
		else:
			set(属性,get(属性)+效果数据[属性])
			if 属性字典.has(属性):
				属性改变信息+=属性字典[属性]
				if 效果数据[属性]>=0:
					属性改变信息+="+"
				属性改变信息+=(str(效果数据[属性])+" ")
	if 属性改变信息!="":
		属性改变信息=" ("+属性改变信息+") "
		年度信息+=属性改变信息
		
func 改变随机属性(N:int):
	var index=randi_range(0,3)
	var 属性=随机属性列表[index]
	set(属性,get(属性)+N)

func 触发年龄随机事件():
	if 游戏进行中:
		年度信息=str(AGE)+"岁:"
		var 随机事件:事件数据类=GameFactory.获取年龄随机事件(AGE)
		if 随机事件!=null:
			随机事件.事件触发()
			显示年度信息()
			
		if game_over():
			age_timer.stop()
			游戏进行中=false
			游戏结束.emit()
	
func 激活天赋():
	for 天赋 in 天赋集:
		天赋.天赋激活()	
	
func 过一年():
	AGE+=1	
	激活天赋()		
	触发年龄随机事件()		

func 游戏开始():
	游戏进行中=true
	激活天赋()
	age_timer.start()

func 获取TLT():
	var tlt:MyArray=MyArray.new()
	for 天赋 in 天赋集:
		tlt.append(天赋.id)	
	return tlt
	
func 添加信息(信息:String):
	信息=信息.replace("\n", "").replace("\r", "")
	年度信息+=信息

func 显示年度信息():
	推送年度信息.emit(年度信息)

func 获取随机天赋():
	return GameFactory.获取随机天赋(天赋刷新个数)

func 添加天赋(天赋:天赋数据类):
	if 天赋集.size()<可选天赋个数 and not 天赋集.has(天赋):
		天赋集.append(天赋)
		return true
	return false
	
func 移除天赋(天赋:天赋数据类):
	if 天赋集.has(天赋):
		天赋集.erase(天赋)
		return true
	return false	

func 获取可用天赋数():
	return 可选天赋个数-天赋集.size()

func game_over():
	return LIF<=0 or AGE>500

func 重置属性():
	INT=0
	MNY=0
	CHR=0
	STR=0
	SPR=0
	LIF=1
	AGE=0

func 替换天赋():
	for i in range(天赋集.size()):
		var 天赋=天赋集[i]
		if 天赋.替换数据:
			var 随机数据=GameFactory.获取随机数据(天赋.替换数据.数据)
			if 天赋.替换数据.类型=="品质":
				var 品质=随机数据
				天赋集[i]=GameFactory.获取品质随机天赋(品质)
			elif 天赋.替换数据.类型=="天赋":
				var 天赋id=随机数据
				天赋集[i]=GameFactory.获取天赋(str(天赋id))			

func 初始化可用属性点():
	for 天赋 in 天赋集:
		最大可用属性点+=天赋.初始点数	

func 普通初始化():
	重置属性()
	for 属性 in 初始数据:
		set(属性,初始数据[属性])	
	EVT.clear()
	TLT.clear()
	AEVT.clear()
	天赋集.clear()
	当前名人=null
	
func 名人初始化(名人:名人数据类):
	普通初始化()
	for 属性 in 名人.属性数据:
		set(属性,名人.属性数据[属性])	
	天赋集=名人.天赋集.duplicate(true)
	当前名人=名人
	
